package com.hnist.empdemo.view;

import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.*;
import javafx.scene.paint.Color;
import javafx.stage.Stage;

import com.hnist.empdemo.client.LoginClient;
import com.hnist.empdemo.common.Config;
import com.hnist.empdemo.network.LoginResponse;
import com.hnist.empdemo.utils.CredentialManager;

public class LoginInterface {

    // 统一常量：左侧图标/占位符宽度、行内间距、行间距
    private static final double LEFT_ICON_WIDTH = 24;  // 图标/占位符宽度
    private static final double INNER_SPACING = 15;    // 行内组件间距
    private static final double ROW_SPACING = 20;      // 行之间的间距

    private CredentialManager credentialManager;

    private TextField usernameField;
    private PasswordField passwordField;
    private CheckBox rememberPasswordCheckBox;
    private CheckBox autoLoginCheckBox;
    private Label errorLabel;

    public void start1(Stage primaryStage) {
        credentialManager = new CredentialManager();


        // 顶部蓝色区域
        Region topBlueRegion = new Region();
        topBlueRegion.setPrefHeight(100);
        topBlueRegion.setBackground(
                new Background(new BackgroundFill(Color.SKYBLUE, CornerRadii.EMPTY, Insets.EMPTY))
        );

        // 中间内容容器
        VBox contentContainer = new VBox(30);
        contentContainer.setPadding(new Insets(30, 30, 30, 30));
        contentContainer.setAlignment(Pos.CENTER);

        // 1. 用户名行
        HBox row1 = createRow(); // 使用统一方法创建行
        ImageView userIcon = new ImageView(new Image(getClass().getResourceAsStream("/image/user_icon.png"), LEFT_ICON_WIDTH, LEFT_ICON_WIDTH, true, true));
        usernameField = new TextField(); // 修改为成员变量赋值
        usernameField.setPromptText("请输入用户名");
        usernameField.setPrefWidth(200);
        row1.getChildren().addAll(userIcon, usernameField);


        // 2. 密码行
        HBox row2 = createRow();
        ImageView pwdIcon = new ImageView(new Image(getClass().getResourceAsStream("/image/pwd_icon.png"), LEFT_ICON_WIDTH, LEFT_ICON_WIDTH, true, true));
        passwordField = new PasswordField(); // 修改为成员变量赋值
        passwordField.setPromptText("密码");
        passwordField.setPrefWidth(200);

        row2.getChildren().addAll(pwdIcon, passwordField);

        // 3. 复选框行（左侧用占位符对齐图标）
        HBox row3 = createRow();
        Region spacer = new Region();
        spacer.setPrefWidth(LEFT_ICON_WIDTH); // 与图标宽度一致
        HBox checkboxRow = new HBox(20);
        rememberPasswordCheckBox = new CheckBox("记住密码"); // 修改为成员变量赋值
        autoLoginCheckBox = new CheckBox("自动登录");

        rememberPasswordCheckBox.selectedProperty().addListener((observable, oldValue, newValue) -> {
            if (!newValue) {
                // 如果取消记住密码，则也取消自动登录
                if (autoLoginCheckBox != null) {
                    autoLoginCheckBox.setSelected(false);
                }
            }
        });

        autoLoginCheckBox.selectedProperty().addListener((observable, oldValue, newValue) -> {
            if (newValue) {
                // 如果选择自动登录，则也选择记住密码
                if (rememberPasswordCheckBox != null) {
                    rememberPasswordCheckBox.setSelected(true);
                }
            }
        });

        checkboxRow.getChildren().addAll(rememberPasswordCheckBox, autoLoginCheckBox);
        row3.getChildren().addAll(spacer, checkboxRow);

        // 4. 登录按钮行（左侧用占位符对齐图标）
        HBox row4 = createRow();
        Region loginSpacer = new Region();
        loginSpacer.setPrefWidth(LEFT_ICON_WIDTH);
        Button loginButton = new Button("登 录");
        loginButton.setPrefWidth(200);
        loginButton.setStyle("-fx-background-color: skyblue; -fx-text-fill: white;-fx-font-size: 14px; ");
        row4.getChildren().addAll(loginSpacer, loginButton);

        // 5. 错误提示标签行
        HBox row5 = createRow();
        Region errorSpacer = new Region();
        errorSpacer.setPrefWidth(LEFT_ICON_WIDTH);
        errorLabel = new Label(); // 确保这里是对成员变量的赋值
        errorLabel.setStyle("-fx-text-fill: red;");
        errorLabel.setVisible(false); // 初始时隐藏
        row5.getChildren().addAll(errorSpacer, errorLabel);

        // 组合所有行（行间距统一）
        VBox middleFormBox = new VBox(ROW_SPACING);
        middleFormBox.getChildren().addAll(row1, row2, row3, row4, row5);

        // 新增HBox包裹middleFormBox，专门控制水平居中
        HBox hBox = new HBox();
        hBox.setAlignment(Pos.CENTER); // 让middleFormBox在HBox内水平居中
        hBox.getChildren().add(middleFormBox); // 将表单容器放入HBox

        contentContainer.getChildren().add(hBox);

        loadSavedCredentials();

        //登录按钮事件
        loginButton.setOnAction(e -> {
            String username = usernameField.getText();
            String password = passwordField.getText();

            // 创建客户端并连接服务器
            LoginClient client = new LoginClient("localhost", 9000);
            if (!client.connect()) {
                errorLabel.setText("无法连接到服务器");
                errorLabel.setVisible(true);
                return;
            }

            // 发送登录请求
            LoginResponse response = client.login(username, password);
            client.disconnect();

            if (response.isSuccess()) {
                // 记住密码功能
                if (rememberPasswordCheckBox.isSelected()) {
                    credentialManager.saveCredentials(username, password);
                    // 保存自动登录状态
                    credentialManager.saveAutoLoginStatus(autoLoginCheckBox.isSelected());
                } else {
                    credentialManager.clearCredentials();
                    credentialManager.saveAutoLoginStatus(false);
                }

                // 登录成功，打开管理员界面
                try {
                    Managementface managementface = new Managementface();
                    managementface.setCurrentUser(username);
                    Stage adminStage = new Stage();
                    Image icon = new Image(getClass().getResourceAsStream("/image/logo.png"));
                    adminStage.getIcons().add(icon);
                    managementface.start2(adminStage);
                    primaryStage.close(); // 关闭登录窗口
                } catch (Exception ex) {
                    ex.printStackTrace();
                }
            } else {
                // 登录失败，显示错误信息
                errorLabel.setText(response.getMessage());
                errorLabel.setVisible(true);
            }
        });

        // 密码输入框回车事件处理
        passwordField.setOnAction(e -> loginButton.fire());

        // 整体布局
        BorderPane root = new BorderPane();
        root.setTop(topBlueRegion);
        root.setCenter(contentContainer);

        // 窗口设置
        Scene scene = new Scene(root, 600, 400);
        primaryStage.setTitle("登录界面");
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    // 统一创建行的方法：保证行内间距和对齐方式一致
    private HBox createRow() {
        HBox row = new HBox(INNER_SPACING); // 行内间距统一
        row.setAlignment(Pos.CENTER_LEFT);   // 对齐方式统一（垂直居中+水平左对齐）
        return row;
    }

    private void loadSavedCredentials() {
        // 添加空值检查避免 NullPointerException
        if (credentialManager != null && credentialManager.hasSavedCredentials()) {
            String[] credentials = credentialManager.loadCredentials();
            if (usernameField != null && passwordField != null && rememberPasswordCheckBox != null) {
                usernameField.setText(credentials[0]);
                passwordField.setText(credentials[1]);
                rememberPasswordCheckBox.setSelected(true);

                // 检查自动登录状态
                if (autoLoginCheckBox != null && credentialManager.getAutoLoginStatus()) {
                    // 这里需要检查自动登录次数，假设 CredentialManager 或新类中有相关方法
                    // if (autoLoginManager.canAutoLogin()) { // 如果有单独的 AutoLoginManager
                    if (credentialManager.canAutoLogin()) { // 如果方法在 CredentialManager 中
                        autoLoginCheckBox.setSelected(true);
                        // 执行自动登录
                        performAutoLogin(credentials[0], credentials[1]);
                        // 增加自动登录计数
                        // autoLoginManager.incrementAutoLoginCount(); // 如果有单独的 AutoLoginManager
                        credentialManager.incrementAutoLoginCount(); // 如果方法在 CredentialManager 中
                    } else {
                        // 超过自动登录次数限制，在界面上显示提示
                        if (errorLabel != null) {
                            errorLabel.setText("自动登录次数已用完，请手动登录");
                            errorLabel.setVisible(true);
                        }
                        // 清除自动登录状态
                        credentialManager.saveAutoLoginStatus(false);
                    }
                }
            }
        }
    }
    private void performAutoLogin(String username, String password) {
        // 使用 Platform.runLater 确保在 JavaFX 线程中执行
        javafx.application.Platform.runLater(() -> {
            // 创建客户端并连接服务器
            LoginClient client = new LoginClient("localhost", 9000);
            if (!client.connect()) {
                errorLabel.setText("无法连接到服务器");
                errorLabel.setVisible(true);
                return;
            }

            // 发送登录请求
            LoginResponse response = client.login(username, password);
            client.disconnect();

            if (response.isSuccess()) {
                try {
                    // 自动登录成功，直接跳转到管理界面
                    Managementface managementface = new Managementface();
                    managementface.setCurrentUser(username);
                    Stage adminStage = new Stage();
                    managementface.start2(adminStage);

                    // 获取当前舞台并关闭
                    Stage currentStage = (Stage) usernameField.getScene().getWindow();
                    if (currentStage != null) {
                        currentStage.close();
                    }
                } catch (Exception ex) {
                    ex.printStackTrace();
                }
            } else {
                // 登录失败，显示错误信息
                errorLabel.setText(response.getMessage());
                errorLabel.setVisible(true);
            }
        });
    }
}